-
Notifications
You must be signed in to change notification settings - Fork 14.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
refactor: Allow superset to be deployed under a prefixed URL #30134
base: master
Are you sure you want to change the base?
Conversation
Thanks for tackling this... it's a popular request, no doubt about it. If you think it's relevant, we might also want to add an entry in the documentation somewhere. |
Yes agreed I definitely need to add some documentation for how to use this. I wanted to wait until I was more confident that the general approach was acceptable before working on describing how to use it. In terms of a review as part of #26319 is there anything I need to do at the moment? |
); | ||
this.baseUrl = url.href.replace(/\/+$/, ''); // always strip trailing slash | ||
this.basePath = basePath.replace(/\/+$/, ''); // always strip trailing slash |
Check failure
Code scanning / CodeQL
Polynomial regular expression used on uncontrolled data High
regular expression
library input
This
regular expression
library input
I think this may be quite an undertaking and might have to be tackled in phases. Would love to see this done :) I remember giving it a shot early on in the project at least once, and never wrapped up the work. My main advice would be to avoid taking in side mission or bigger refactor while tackling this. |
docker/docker-frontend.sh
Outdated
@@ -17,19 +17,23 @@ | |||
# | |||
set -e | |||
|
|||
# zstd exe is required by simple-zstd package | |||
apt-get update | |||
apt-get install -y zstd |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
there's a recent fix in master for this
Thanks for these changes. |
For what it's worth, we've been running this fork to serve superset on a path prefix in a Kubernetes(K3S) + traefik context without any problems so far. Though testing has been limited. Thanks for the work so far |
When ENABLE_PROXY_FIX is configured url_for will ensure any base prefix is correctly dealt with.
Allows an application prefix to be defined separately to the URL prefix used for the static assets. Webpack looks for a BASE_PATH environment variable and injects this into the built assets.
93d66c7
to
09a05b3
Compare
Docker version of superset_config sets ENABLE_PROXY_FIX=True if BASE_PATH not empty.
09a05b3
to
fe3b01a
Compare
Sorry for the delay in replying to this. I've had zero time to spend on this lately. The latest commits rebase on the current master and I have also added some documentation to the configuring superset pages that describe the new variables with an example |
If you think it's ready for review, I'd say you can go ahead and move it from Draft to "Ready for Review" - though it looks like CI might need a little more love still. As for the SIP, since @sfirke reopened the GitHub issue, I set the SIP itself back to "pre-discussion" state for its official consensus. Did you want to re-kindle that pre-existing SIP, or would it be easier to open a new one? I'm happy to help you carry that SIP through to fruition if you'd like. Feel free to DM me on slack if it's easier. |
When clicking on the user list or role list, and then clicking on datasets, a 404 error appears. |
Thanks a lot for the response. Also dashboard menu items export to PDF/image not working (Dashboard -> Download -> Export to PDF/Download as Image) |
I tried to fix above issue of missing prefixes in top-level menu. Please check this PR 2 |
The solution really works. Solved a long term issue in our deployment behind proxies. Hoping to get merged soon with official code base |
Very good, looking forward to merging the code soon |
For whom it may concern, I'm testing with a port of this work to 3.1.1rc1 available from watercraft:superset branch prefix |
Hi, I can see this PR is still flagged as DRAFT. What's left to do to get it "Ready for Review" ? @martyngigg do you need help in completing this PR ? I'm quite a superset newbie, but I'm willing to provide some help if necessary to get this merged. |
Dear all, Thank you so much for taking the time to test out these changes and I apologise (again!) for the lack of response to any comments. @ravikantkml Thanks for the PR fixing the menu links - I think that looks okay and I'll merge it. I think the remaining issues are fixing the issues with screenshot generation. I had a brief look at this today and I'm having trouble getting them working even without any prefixed path set - I must have an issue in my development setup. Today is my last day of work before Christmas break but I will have time when I return to pick this up properly. I'll aim to get it to "Ready for Review" as soon as possible after the holidays. @jeanpommier Thanks for the offer of help too - If you wanted to try and tackle the screenshot generation problem then that would be super helpful but equally I'm happy to look at it after the break. Happy Holidays! 🎅🏻 |
testing the PR here outside of the docker context (eg pip install from that github branch branch, rebuild the assets with BASE_PATH set), that work is much welcome. some notes so far.. i think it should be mentioned that APP_ICON and FAVICON needs BASE_PATH prepended, otherwise it generates 404's here with the default value from looking a bit more at the code/PR, all assets below STATIC_ASSETS_PREFIX also need to default to BASE_PATH ? that fixes the FAVICON while here. with this config the superset homepage loads fine with all its assets/images/favicon:
edit oh, i was pretty sure i saw those bits somewhere.. they are in the docker part of the PR in https://github.com/apache/superset/pull/30134/files#diff-415de08cbf9e8633d6cf2c439df7aa08bf9ebce684833ee837d6ce7d7ab7d53b. should those bits be documented, or copied over to the default superset config.py ? |
Happy New Year! I've investigated further and found the issue with "Export to PDF" & "Download image" not working on dashboards. The issue seems to be the interaction of the headless browser and A fix/workaround (??) seems to be to set |
Hello ! Happy new year !
Well, I might have a solution for this one. I didn't get the time to look at the image generation task you proposed, but I was rather investigating around the path prefix topic. My concern was to avoid relying on a reverse-proxy for the path-prefix thing. IMO, it makes things complicated. For instance the issue you met above: dev setup (without docker compo) and prod-like setup with a reverse proxy works differently, with a different frontend where the path is hard-coded. But, I stumbled across this blog post where I discovered that WSGI protocol supports a parameter that sets such a path prefix, and that is handled on the WSGI side of it (e.g. gunicorn). I tested it (on top of your PR since we need the url_for links) and it works like a charm. What does it change ? Supposing you choose I'm still quite uncomfortable at the necessity to build the frontend to support a path other than root. I haven't made experiments yet on this, but wouldn't it be conceivable that the frontend looks for a config instruction from the backend to get this information ? |
@jeanpommier Thanks for exploring and trying out the idea with having the backend also run on the prefix. I remember trying something like this a while ago and for some reason it didn't work properl. I think I may have been a bit hasty in dropping the idea and it was likely my lack of understanding of Superset that was the problem. I certainly agree relying on the proxy for the prefix handling is complicated. I'll try again since it certainly seems to just require an environment variable :)
Yes this is also annoying. Now I'm a bit more familiar with the code base I wondered about including it in this superset/superset/views/base.py Line 333 in a986a61
|
@martyngigg try APPLICATION_ROOT, by setting it to a specific perfix, i found it works |
The trick is, you still need to set the BASE_PATH env var for the frontend (needs for now to be built with the prefix), but not for the superset backend, since this is the WSGI server that handles the prefix. Here is a patch that should work, to run it with the gunicorn server. I've recently rebased your PR against master, so you might get a bit of noise in the docker-compo: gunicorn_script_name.patch.gz And a similar patch to run the same principle with the flask dev server. I still haven't looked at a common way to get this to work, but it shouldn't be too complicated (I guess there is some flag somewhere indicating if we run the dev server): |
Hi @martyngigg from me point of view, it looks like the perfect place, but I'm no Superset developer. I've been playing around quite a bit on this topic, but am still struggling about dynamic configuration of the path prefix for the frontend (i.e. without dedicated build). Did you make progress on your side ? |
SUMMARY
Introduces changes in the front and backend to allow Superset to be deployed under a prefixed-URL path rather than the root of the domain. A new environment variable
BASE_PATH
has been introduced into webpack, alongside the existingASSET_BASE_URL
, to define the prefix.The frontend has been updated to include the prefix in any resource links along with two new helper utilities,
assetUrl
&pathUtils
, to help construct the paths. TheSupersetClient
has been update to remove the unusedbaseUrl
field and rename it asbasePath
such that the object can be initialized with the base path and calling any endpoints through this class can use the same relative link as before. QUESTION: Have I broken an API here?The backend has been refactored to avoid using hardcoded paths in redirects and instead uses
Flask.url_for
to construct reference. This requires that the proxy server set theX-Forwarded-Prefix
header along with settingENABLE_PROXY_FIX=True
insuperset_config.py
BEFORE/AFTER SCREENSHOTS OR ANIMATED GIF
TESTING INSTRUCTIONS
ADDITIONAL INFORMATION